//
//  ViewController.m
//  练习Block
//
//  Created by 苗钧豪 on 16/8/19.
//  Copyright © 2016年 苗钧豪. All rights reserved.
//

#import "ViewController.h"
#import "NestViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *mylabel;
// Blcok 写在属性中
@property(nonatomic,copy) void (^myblock)();
// Block 写在方法中
- (void)handleData:(void (^)(void))handleData;
@end

@implementation ViewController
- (void)handleData:(void (^)(void))handleData {
    [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest new] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        handleData();
    }];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.Block 是啥？
    // Block 与 函数 相似，有固定功能的代码段
    // 2.Block基本语法
    // block 声明
    void (^block)();  // 相当于 int a; // 类型：void (^)() 变量名：block
    // block 赋值
    block = ^(void) {
        
    };
    // 总结
    /*
     声明：
        返回值类型(^block名)(参数列表)
     赋值：
        block变量 = ^(参数列表) { 固定的代码段 };
     */
    // 3.Block的几种形式
    // 有参有返回值
    int (^block1)(int , int) = ^(int a ,int b) {
        return a + b ;
    };
    // 有参无返回值
    void (^block2)(int , int) = ^(int a , int b) {
        NSLog(@"%d-----%d",a,b);
    };
    // 无参有返回值
    int (^block3)() = ^{
        return 1;
    };
    // 无参无返回值
    void (^block4)() = ^{
        NSLog(@"2");
    };
    // 系统提供的代码块写法：inlinBlock
//    <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
//        <#statements#>
//    };
    // 4.Block调用
    block1(10,20);
    block2(5,8);
    block3();
    block4();
    // 5.系统中的Block
    // ①模态 (^ __nullable)(void))completion
//    [self presentViewController:[UIViewController new] animated:YES completion:<#^(void)completion#>]
    // ②GCD (^dispatch_block_t)(void)
//    dispatch_sync(<#dispatch_queue_t  _Nonnull queue#>, <#^(void)block#>)
    // ③网络请求 (void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler
//    [[NSURLSession sharedSession]dataTaskWithRequest:<#(nonnull NSURLRequest *)#> completionHandler:<#^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)completionHandler#>]
    // 6.Block写在属性和方法上
    // 属性block修饰符，使用copy
    self.myblock = block4;
    self.myblock();
    // 带上block的方法的调用
    [self handleData:^{
        
    }];
    // 7.Block的修饰符
    // __block __weak __strong
    // ① __block 在ARC和MRC下有区别
    // 可以在block内部修改外部变量 => 通用
    // 可以避免循环引用 => MRC下
    int __block a = 0;
    void (^blockTest)() = ^{
        a = 100;
    };
    // ② __weak 弱引用 修饰Block外的变量
    // 只能在ARC下用，避免Block的循环引用
    
    // ③ __strong 强引用 
}
- (IBAction)pushNextView:(id)sender {
    NestViewController *vc = [NestViewController new];
    // 值传递，需要实现Block
    // 告诉Block 该指针为弱引用
    NestViewController * __weak weakVC = vc;
    vc.passTitle = ^(NSString *title) {
        // Block 会对其内部的所有对象进行强引用
        self.mylabel.text = title;
        weakVC.view.backgroundColor = [UIColor yellowColor];
    };
    [self.navigationController pushViewController:vc animated:YES];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
